#include <iostream>
#include <fstream>
#include <cstdio>
#include <sstream>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <string>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <deque>
#include <ctime>
#include <cstdlib>

using namespace std;

#define sz(x) ((int)((x).size()))

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;

const double EPS = 1e-9;
const double PI = acos(-1.0);

const int MAXN = (int)(2e5) + 10;
const ll INF = (ll)(1e18);


#define pb push_back
#define mp make_pair
#define fs first
#define sc second
vector<pair<int, pair<int, int> > > rb[20100];
bool used[20100];
int tin[20100], tout[20100], timer = 0;
ll di[20100];
vector<int> otv;

void dfs(int u, int pr = -1) {
	used[u] = 1;
	tin[u] = timer;
	tout[u] = timer++;
	for(int i = 0; i < rb[u].size(); i++) {
		if (rb[u][i].fs == pr)
			continue;
		if(di[u] - rb[u][i].sc.fs == di[rb[u][i].fs]) {
			if(!used[rb[u][i].fs]) {
				dfs(rb[u][i].fs, u);
				tout[u] = min(tout[u], tout[rb[u][i].fs]);
				if(tout[rb[u][i].fs] > tin[u]) {
					otv.pb(rb[u][i].sc.sc);
				}
			} else {
				tout[u] = min(tout[u], tin[rb[u][i].fs]);
			}
		} else if (di[u] + rb[u][i].second.first == di[rb[u][i].first]) {
			if(!used[rb[u][i].fs]) {
				dfs(rb[u][i].fs, u);
				tout[u] = min(tout[u], tout[rb[u][i].fs]);
				if(tout[rb[u][i].fs] > tin[u]) {
					otv.pb(rb[u][i].sc.sc);
				}
			} else {
				tout[u] = min(tout[u], tin[rb[u][i].fs]);
			}
		}
	}
}

int main() {
	//freopen(".in", "r", stdin);
	//freopen(".out", "w", stdout);

	int n, m;
	scanf("%d%d", &n, &m);
	for(int i = 0; i < m; i++) {
		int u, v, c;
		scanf("%d%d%d", &u, &v, &c);
		rb[u].pb(mp(v, mp(c, i + 1)));
		rb[v].pb(mp(u, mp(c, i + 1)));
	}

	priority_queue<pair<int, int> > q;
	q.push(mp(0, 1));
	while(!q.empty()) {
		pair<int, int> p = q.top(); q.pop();
		if(!used[p.sc]) {
			used[p.sc] = 1;
			di[p.sc] = -p.fs;
			for(int i = 0; i < sz(rb[p.sc]); i++) {
				if(!used[rb[p.sc][i].fs]) {
					q.push(mp(-di[p.sc] - rb[p.sc][i].sc.fs, rb[p.sc][i].fs));
				}
			}
		}
	}

	for(int i = 1; i <= n; i++) {
		used[i] = 0;
	}
	dfs(n);
	printf("%d\n", sz(otv));
	for (int i = 0; i < sz(otv); i++) {
		printf("%d ", otv[i]);
	}
	puts("");

	return 0;
}
